"""
色块生成器核心模块
负责生成纯色图片
"""

from PIL import Image
from typing import Tuple
from pathlib import Path

from ..utils.color_utils import ColorUtils
from ..utils.file_utils import FileUtils


class ColorBlockGenerator:
    """色块生成器类"""
    
    def __init__(self):
        """初始化色块生成器"""
        pass
    
    def generate_color_block(self, hex_color: str, width: int, height: int) -> Image.Image:
        """
        生成纯色色块图片
        
        Args:
            hex_color (str): 16进制颜色值
            width (int): 图片宽度
            height (int): 图片高度
            
        Returns:
            Image.Image: PIL图片对象
            
        Raises:
            ValueError: 颜色或尺寸无效
        """
        # 验证颜色
        if not ColorUtils.validate_hex_color(hex_color):
            raise ValueError(f"无效的颜色值: {hex_color}")
            
        # 验证尺寸
        if width <= 0 or height <= 0:
            raise ValueError("宽度和高度必须大于0")
            
        # 转换颜色为RGB
        rgb_color = ColorUtils.hex_to_rgb(hex_color)
        
        # 创建纯色图片
        image = Image.new('RGB', (width, height), rgb_color)
        
        return image
    
    def save_image(self, image: Image.Image, filepath: str, format_name: str = "PNG", quality: int = 95) -> bool:
        """
        保存图片到文件
        
        Args:
            image (Image.Image): PIL图片对象
            filepath (str): 保存路径
            format_name (str): 图片格式
            quality (int): 图片质量（仅JPEG有效）
            
        Returns:
            bool: 是否保存成功
        """
        try:
            # 确保目录存在
            FileUtils.ensure_directory(str(Path(filepath).parent))
            
            # 保存图片
            save_kwargs = {}
            if format_name.upper() == "JPEG":
                save_kwargs["quality"] = quality
                save_kwargs["optimize"] = True
            
            image.save(filepath, format=format_name, **save_kwargs)
            return True
            
        except Exception as e:
            print(f"保存图片失败: {e}")
            return False
    
    def generate_and_save(self, hex_color: str, width: int, height: int, 
                         filepath: str, format_name: str = "PNG") -> bool:
        """
        生成并保存色块图片
        
        Args:
            hex_color (str): 16进制颜色值
            width (int): 图片宽度
            height (int): 图片高度
            filepath (str): 保存路径
            format_name (str): 图片格式
            
        Returns:
            bool: 是否成功
        """
        try:
            # 生成图片
            image = self.generate_color_block(hex_color, width, height)
            
            # 保存图片
            return self.save_image(image, filepath, format_name)
            
        except Exception as e:
            print(f"生成和保存图片失败: {e}")
            return False
    
    def generate_preview(self, hex_color: str, size: Tuple[int, int] = (200, 200)) -> Image.Image:
        """
        生成预览图片
        
        Args:
            hex_color (str): 16进制颜色值
            size (Tuple[int, int]): 预览尺寸
            
        Returns:
            Image.Image: 预览图片
        """
        return self.generate_color_block(hex_color, size[0], size[1])